Skip to content

Fix fat jar build and update dependencies#146

Merged
TheMeinerLP merged 14 commits into
mainfrom
claude/titan-minestom-deployment-XhoNO
Jun 13, 2026
Merged

Fix fat jar build and update dependencies#146
TheMeinerLP merged 14 commits into
mainfrom
claude/titan-minestom-deployment-XhoNO

Conversation

@TheMeinerLP

Copy link
Copy Markdown
Contributor

Summary

This PR addresses issues with the fat jar build process and updates project dependencies to their latest versions.

Key Changes

  • Fat jar build fixes: Added exclusions to the jar task to handle LuckPerms' signed and multi-release jars that were breaking the relocation-free application fat jar:
    • Exclude signature files (META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA)
    • Exclude module-info classes (module-info.class, META-INF/versions/**/module-info.class)
    • Set duplicatesStrategy = DuplicatesStrategy.EXCLUDE to handle duplicate entries
  • Dependency updates:
    • Butterfly: 1.0.211.0.23
    • Minestom: Changed from unversioned to explicit version 2026.05.17-1.21.11
  • Workflow updates: Updated GitHub Actions workflow references to v2.1.0 for both build and publish workflows

Implementation Details

The fat jar exclusions specifically target artifacts pulled by LuckPerms' common module that contain signed JARs and multi-release JAR metadata. These were causing conflicts in the final application JAR. The duplicatesStrategy setting ensures consistent handling of any remaining duplicate entries during the merge process.

https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP

…n CI

- Pin net.minestom:minestom to 2026.05.17-1.21.11 (current Maven Central
  release) instead of the BOM-resolved version so the deployable jar runs
  on the latest Minestom regardless of aonyx/mycelium BOM lag.
- Bump butterfly 1.0.21 -> 1.0.23 to match the current Butterfly release.
- Harden the application shadowJar: strip jar signatures and module-info
  and exclude duplicates so the relocation-free fat jar built from the
  shaded LuckPerms fork stays loadable.
- Pin the reusable PR/publish workflows to the v2.1.0 release tag instead
  of a temporary branch ref.

https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
@TheMeinerLP TheMeinerLP requested a review from a team as a code owner May 18, 2026 12:25
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

2 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

github-actions Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

Test results

 63 files   63 suites   39s ⏱️
 55 tests  53 ✅ 2 💤 0 ❌
168 runs  162 ✅ 6 💤 0 ❌

Results for commit 0e067e1.

♻️ This comment has been updated with latest results.

Titan shaded net.luckperms common/minestom/minestom-app/loader-utils
into the relocation-free fat jar and bootstrapped LPMinestomBootstrap
directly on the app classpath, defeating LuckPerms' dependency
isolation. Switch to the LuckPerms-designed loader:

- depend on net.luckperms:minestom-loader (runtimeOnly, not shaded)
- net.luckperms:api becomes a runtime (implementation) dependency so
  LuckPermsProvider resolves on the host classpath while the JarInJar
  child loads the isolated implementation against the same API classes
- drop Titan's custom MinestomLoader; TitanApplication now uses the
  fork's me.lucko.luckperms.minestom.loader.MinestomLoader
- add the minestom-loader version catalog entry
- generalise the shadowJar signature/module-info hardening comment

https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

TitanApplication references me.lucko.luckperms.minestom.loader.MinestomLoader
directly, so the loader is needed at compile time; runtimeOnly removed it
from compileClasspath and broke compilation. Use implementation: the
minestom-loader artifact is a thin JarInJar wrapper with no heavy
transitive dependencies (adventure/configurate live inside the embedded
luckperms-minestom.jarinjar resource), so this does not reintroduce raw
shading of common/minestom.

https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

5 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

Pinning Minestom to 2026.05.17-1.21.11 decoupled it from the OLF BOM
that also governs the cyano test harness; cyano 0.7.1 was built against
an older Minestom, so RegistryData's static initializer threw
NoSuchMethodError and all Minestom-backed tests failed. aonyx-bom 0.7.2
aligns cyano with Minestom 2026.05.17-1.21.11.

https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

2 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

enforcedPlatform(mycelium-bom) pinned net.kyori:adventure-* classpath-
wide; the pinned Adventure was older than Minestom 2026.05.17-1.21.11
requires, so MinestomFlattenerProvider.<clinit> failed with
NoSuchMethodError: ComponentFlattener.toBuilder(). Switching to
platform(...) keeps the BOM as a version recommendation that Gradle can
upgrade to satisfy Minestom's transitive Adventure version requirement.
Applied in :common and :setup, the two modules using enforcedPlatform.

https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

2 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

Copy link
Copy Markdown
Contributor

Job Summary for Gradle

Build PR :: build
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
titan build test 9.5.0 Build Scan not published

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

TheMeinerLP and others added 3 commits June 13, 2026 16:10
aonyx-bom 0.7.2 was never published (latest release is 0.7.3); bump to
the existing version. Also align mycelium-bom to 1.6.5, let minestom be
managed by the BOM, bump aves to 1.14.0, and trim the unused LuckPerms
catalog entries down to the minestom-loader.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Switch luckperms-api and minestom-loader to compileOnly/runtimeOnly and
exclude net.kyori.adventure so the bundled adventure version wins. The
aonyx-bom platform is no longer applied in :app (minestom comes via the
catalog), and the loader is invoked by FQN in TitanApplication.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-deployment-XhoNO

# Conflicts:
#	app/build.gradle.kts
#	settings.gradle.kts
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

TheMeinerLP and others added 6 commits June 13, 2026 17:46
aves 1.14.1 reworked BaseMap into an immutable type: accessors are now
name()/spawn()/builders() (List<String>) instead of getName()/getSpawn()/
getBuilders(), there are no setters, and the only constructor is
BaseMap(String, Pos, List<String>).

Give LobbyMap a matching constructor, build instances through it in
LobbyMapBuilder (dropping the dead setter calls), and update MapProvider,
the app/setup listeners and the tests to the new accessors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
aonyx-bom already brings mycelium-bom transitively, so the explicit
mycelium-bom platform was redundant (per Steffen). Remove it everywhere
and the catalog entry, and re-apply aonyx-bom in :app (main + test) so
all modules resolve the same managed versions instead of skewing — :app
was pulling aves 1.14.0 while the BOM pinned 1.14.1. Pin aves to 1.14.1
in the catalog to match.

Also keep the LuckPerms minestom-loader off the test runtime classpath:
it is a JarInJar bootstrap bundling an unrelocated, outdated Gson that
otherwise shadows the real one and breaks Minestom registry init
(GsonBuilder.disableJdkUnsafe NoSuchMethodError).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Minestom 2026 ships Adventure 5, whose Key is an interface Gson cannot
instantiate, so loading app.json failed ("Interfaces can't be
instantiated: net.kyori.adventure.key.Key"). Register aves'
KeyGsonAdapter (via registerTypeHierarchyAdapter so it also covers Key
implementations on write) and migrate the committed app.json from the old
reflective {domain,path} shape to the adapter's {namespace,value}.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CloudNet only provides its runtime when a service is started through its
wrapper, which creates a .wrapper directory in the working directory.
Guard the MinestomBridgeExtension load on that directory so the server
boots standalone (local runs, tests, AOT training) instead of failing in
CloudNet's injector with "Cannot construct abstract type EventManager".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The bundled worlds were saved by older Minecraft versions (DataVersion
3120/3337/3700 = 1.19.4/1.20.1/1.20.4) and failed to load on Minestom
2026 (1.21.11) with "Unknown block minecraft:chain" - the generic chain
block was renamed to iron_chain in 1.21.x. Ran Mojang's 1.21.11 server
--forceUpgrade over every world (worlds/ and test-server/worlds/) to run
the official DataFixerUpper, bringing all chunks to DataVersion 4671.
Server-generated cruft (nether/end dims, datapacks, structure indexes)
was excluded. The lobby now boots standalone and binds in ~2s.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a generateAotCache task that boots the shaded lobby once (JDK 25,
JEP 514 -XX:AOTCacheOutput) and records a portable AOT cache, trained
with the relative classpath "app-titan.jar". The cache is published as
the "aot" classifier artifact next to titan-app.jar.

Deploy with the matching launch to get the speedup (~1.7s -> ~0.75s to
listening in local tests):
  java -XX:AOTCache=app-titan.aot -jar app-titan.jar

A gated -Dtitan.aot.trainSeconds hook in TitanApplication shuts the
server down cleanly after startup so the training JVM writes the cache.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@TheMeinerLP TheMeinerLP merged commit 23b2e38 into main Jun 13, 2026
7 checks passed
@TheMeinerLP TheMeinerLP deleted the claude/titan-minestom-deployment-XhoNO branch June 13, 2026 20:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants